#pragma once

#include <string>

#include "TypeDef.h"

namespace FlooP
{
	class Token
	{
		public:

		enum Type
		{
			NONE,

			LEFT_PARENTHESES, 
			RIGHT_PARENTHESES, 
			LEFT_BRACKET, 
			RIGHT_BRACKET, 
			LEFT_BRACE, 
			RIGHT_BRACE, 

			COLON, 
			SEMICOLON, 

			COMMA,
			DOT,

			DEFINE,
			PROCEDURE,

			IF,
			THEN,
			LOOP,
			MU_LOOP,
			AT,
			MOST,
			TIMES,

			BEGIN,
			END,
			BLOCK,

			QUIT,
			ABORT,

			ARROW,
			EQUALS,
			OR,
			AND,
			LESS_THAN,  
			GREATER_THAN,
			PLUS,
			STAR,

			YES,
			NO,

			CELL,
			OUTPUT,
			NUMBER,
			STRING,
			IDENTIFIER,

			END_OF_FILE	
		};

		Token ();
		Token (Type type);
		Token (Type type, std::string text);
		Token (Type type, uint32_t number);

		Type type () const;
		const std::string& text () const;
		uint32_t number () const;

		private:

		Type		m_type;
		std::string m_text;
		uint32_t	m_number;
	};
}